package model.lendables;

import java.io.File;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import model.EMedium;
import model.EMediumAttribute;
import model.EMediumPropertiesData;
import model.EMediumType;

/**
 * Classe Library 
 * @author DCO37
 * 	N.º 42484 Helder Ferreira
 *  N.º 45509 Luis Ferreira
 */
public class Library implements Iterable<Library> {
	
	private final int capacity = 100;
	private HashMap<File, Lendable>  biblioteca ;
	private Lendable last;
	
	/**
	 * Contrutor Library que contem os itens (alojados num servidor) que
	 * podem ser alugados
	 */
	public Library() {
		biblioteca = new HashMap<File, Lendable>(capacity);
	}
	
	/**
	 * Adiciona um novo media a biblioteca para ser alugado
	 * @param type
	 * @param properties
	 * @return true se for adicionado, false caso contrario
	 */
	public boolean addLendable ( EMediumType type, EMediumPropertiesData properties)  {
		
		Lendable aux = new Lendable(type, properties);
		
		if (!biblioteca.containsKey(aux.getFile())){
			last=aux;
			biblioteca.put(aux.getFile(), aux);
			return true;
		}
		return false;
	}
	
	/**
	 * Devolve o ultimo item adicionado a biblioteca
	 * @return a o ultimo item adicionado
	 */
	public Lendable getLastAddedLendable() {
		return last;
	}
	
	/**
	 * Aluga um item da biblioteca
	 * @param eMedium
	 * @requires canBeRent(eMedium)
	 */
	public void rent(EMedium eMedium) {
		biblioteca.get(eMedium.getFile()).rent();
	}
	
	/**
	 * Verifica se um item pode ser alugado
	 * @param eMedium
	 * @return true se for possivel alugar ou false caso contrario
	 */
	public boolean canBeRent(EMedium eMedium) {
		return biblioteca.get(eMedium.getFile()).hasLicensesAvailable();
		
	}

	/**
	 * Iterador que percorre uma Library
	 */
	@Override
	public Iterator<Library> iterator() {
		return new IteratorBiblioteca(biblioteca); 		
	}
	
}
